package behavior.strategy;

import behavior.strategy.impl.Minus;
import behavior.strategy.impl.Multiply;
import behavior.strategy.impl.Plus;

public class Calculator {
	/**
	 * 这里还可以进一步改造，思路如下：
	 * 1. 增加Calculator的收集器CalculatorHandler
	 * 2. 在初始化CalculatorHandler时获取ICalculator的实现类，然后注册到CalculatorHandler中
	 * 3. 每实现一种计算器给该计算器增加一种type，例如Plus的type就是‘+’，Multiply的type就是'*'
	 * 4. 下面获取到非字符串的字符后就向CalculatorHandler要ICalculator
	 * 
	 * 这样就自动注入不再switch
	 * @param exp
	 * @return
	 */
	private static ICalculator getCalculator(String exp) {
		char[] arr = exp.toCharArray();
		for (char c : arr) {
			if (c == '+' || c == '-' || c == '*') {
				switch (c) {
				case '+':
					return new Plus();
				case '-':
					return new Minus();
				case '*':
					return new Multiply();
				}
			}
		}
		throw new RuntimeException("表达式'" + exp + "'没有找到匹配的计算器");
	}

	public static int calc(String exp) {
		ICalculator calc = getCalculator(exp);
		return calc.calculate(exp);
	}
}
